package pl.edu.agh.mwo.model;

import java.util.AbstractList;
import java.util.ArrayList;

public class KatalogDanych {
	static private AbstractList<UserProjectData> _data = null;

	private KatalogDanych() {
		;
	}

	static public AbstractList<UserProjectData> getKatalogDanych() {
		if (_data == null) {
			_data = new ArrayList<UserProjectData>();
		}

		return _data;
	}

	static public AbstractList<UserProjectData> getKalalogDanychForUser(
			String Imie, String Nazwisko) {
		AbstractList<UserProjectData> data = getKatalogDanych();
		AbstractList<UserProjectData> dataToReturn = new ArrayList<UserProjectData>();

		for (UserProjectData dataFromKatalog : data) {
			if (dataFromKatalog.getImie().compareTo(Imie) == 0
					&& dataFromKatalog.getNazwisko().compareTo(Nazwisko) == 0) {
				dataToReturn.add(new UserProjectData(dataFromKatalog.getImie(),
						dataFromKatalog.getNazwisko(), dataFromKatalog
								.getProject(), dataFromKatalog.getData(),
						dataFromKatalog.getZadanie(), dataFromKatalog
								.getGodziny()));
			}
		}

		return dataToReturn;
	}

	static public AbstractList<UserProjectData> getKalalogDanychForProject(
			String project) {
		AbstractList<UserProjectData> data = getKatalogDanych();
		AbstractList<UserProjectData> dataToReturn = new ArrayList<UserProjectData>();

		for (UserProjectData dataFromKatalog : data) {
			if (dataFromKatalog.getProject().compareTo(project) == 0) {
				dataToReturn.add(new UserProjectData(dataFromKatalog.getImie(),
						dataFromKatalog.getNazwisko(), dataFromKatalog
								.getProject(), dataFromKatalog.getData(),
						dataFromKatalog.getZadanie(), dataFromKatalog
								.getGodziny()));
			}
		}

		return dataToReturn;

	}

	// zwraca liste projektow z zagregowanymi godzinami pracy dla danego
	// Uzytkownika (String user), Dzien tygodnia (day)
	// wartosci dla day:
	// -1 - wszystkie dni
	// 0 - niedziela
	// 1 - pon
	// [...]
	// 6 - sobota

	static public AbstractList<ProjectData> getProjectDataForUserAndDay(
			String Imie, String Nazwisko, int day) {
		AbstractList<UserProjectData> in_data = getKalalogDanychForUser(Imie,
				Nazwisko);

		AbstractList<ProjectData> dataToReturn = new ArrayList<ProjectData>();

		boolean czyJuzJestTakieProject;

		for (UserProjectData daneZKatalogu : in_data) {
			czyJuzJestTakieProject = false;

			// szukamy dla kondretnego dnia
			if (day != -1) {
				// inny dzien niz szukamy
				if (daneZKatalogu.getData().getDay() != day)
					continue;
			}

			petlaWewnrzna: for (ProjectData daneZwracane : dataToReturn) {
				if (daneZwracane.getProject().compareTo(
						daneZKatalogu.getProject()) == 0) {
					czyJuzJestTakieProject = true;

					daneZwracane.setGodziny(daneZwracane.getGodziny()
							+ daneZKatalogu.getGodziny());
					break petlaWewnrzna;
				}
			}

			if (czyJuzJestTakieProject == false) {
				dataToReturn.add(new ProjectData(daneZKatalogu.getProject(),
						daneZKatalogu.getGodziny()));
			}
		}

		return dataToReturn;
	}

	static public AbstractList<ProjectData> getUniqProject() {
		AbstractList<ProjectData> uniqProject = new ArrayList<ProjectData>();

		AbstractList<UserProjectData> data = getKatalogDanych();

		boolean czyJuzJestTakieProjekt;

		for (UserProjectData daneZKatalogu : data) {
			czyJuzJestTakieProjekt = false;

			petlawewnrzna: for (ProjectData daneZwracane : uniqProject) {
				if (daneZwracane.getProject().compareTo(
						daneZKatalogu.getProject()) == 0) {
					czyJuzJestTakieProjekt = true;

					daneZwracane.setGodziny(daneZwracane.getGodziny()
							+ daneZKatalogu.getGodziny());
					break petlawewnrzna;
				}
			}

			if (czyJuzJestTakieProjekt == false) {
				uniqProject.add(new ProjectData(daneZKatalogu.getProject(),
						daneZKatalogu.getGodziny()));
			}
		}

		return uniqProject;
	}

	static public AbstractList<ProjectData> getData(int personIndex) {
		UserData dane = getUniqUsers().get(personIndex);
		
		return getProjectDataForUserAndDay(dane.getImie(), dane.getNazwisko(),
				-1);
	}

	static public AbstractList<UserData> getUniqUsers() {
		AbstractList<UserData> uniqUsers = new ArrayList<UserData>();

		AbstractList<UserProjectData> data = getKatalogDanych();

		boolean czyJuzJestTakieProjekt;

		for (UserProjectData daneZKatalogu : data) {
			czyJuzJestTakieProjekt = false;

			petlawewnrzna: for (UserData daneZwracane : uniqUsers) {
				if (daneZwracane.getNazwisko().compareTo(
						daneZKatalogu.getNazwisko()) == 0
						&& daneZwracane.getImie().compareTo(
								daneZKatalogu.getImie()) == 0) {
					czyJuzJestTakieProjekt = true;

					daneZwracane.setGodziny(daneZwracane.getGodziny()
							+ daneZKatalogu.getGodziny());
					break petlawewnrzna;
				}
			}

			if (czyJuzJestTakieProjekt == false) {
				uniqUsers
						.add(new UserData(daneZKatalogu.getImie(),
								daneZKatalogu.getNazwisko(), daneZKatalogu
										.getGodziny()));
			}
		}

		return uniqUsers;
	}

	static public boolean addData(AbstractList<UserProjectData> dane) {
		AbstractList<UserProjectData> data = getKatalogDanych();

		return data.addAll(dane);
	}

	static public boolean addData(UserProjectData dane) {
		AbstractList<UserProjectData> data = getKatalogDanych();

		return data.add(dane);
	}
}
